﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

using Arquitetura.UI.WebApp.SecretariaServiceReference;

namespace Arquitetura.UI.WebApp
{
    public static class ResulHelper
    {
        public static string ConsolidateResult(this Result resultado, string separador)
        {
            StringBuilder sb = new StringBuilder(string.Empty);
            for (int i = 0; i < resultado.Messages.Count; ++i)
            {
                ResultMessage mensagem = resultado.Messages[i];
                if (mensagem.Informations.Any())
                {
                    for (int j = 0; j < mensagem.Informations.Count; ++j)
                    {
                        string informacao = mensagem.Informations[j];
                        if (!string.IsNullOrEmpty(informacao))
                        {
                            sb.Append(informacao);
                            if (j < (mensagem.Informations.Count - 1))
                            {
                                sb.Append(separador);
                            }
                        }
                    }

                    if (i < (resultado.Messages.Count - 1))
                    {
                        sb.Append(separador);
                    }
                }
            }
            return sb.ToString();
        }

        public static void ConsolidateResult(this Result result, ListOfValidatorResult listOfValidatorResult)
        {
            ClearAllMessageValidationControls(listOfValidatorResult);
            Dictionary<ValidatorResult, List<ResultMessage>> errosEspecificos = new Dictionary<ValidatorResult, List<ResultMessage>>();
            List<ResultMessage> errosGenericos = new List<ResultMessage>();
            foreach (ResultMessage mensagem in result.Messages)
            {
                ValidatorResult validatorResult = listOfValidatorResult
                    .Where(tr => tr.EntityName.Equals(mensagem.EntityName) &&
                                 tr.EntityField.Equals(mensagem.EntityField))
                    .SingleOrDefault();
                if (validatorResult != null)
                {
                    if (errosEspecificos.Keys.Contains(validatorResult))
                    {
                        errosEspecificos[validatorResult].Add(mensagem);
                    }
                    else
                    {
                        errosEspecificos[validatorResult] = new List<ResultMessage>();
                        errosEspecificos[validatorResult].Add(mensagem);
                    }
                }
                else
                {
                    errosGenericos.Add(mensagem);
                }
            }

            List<ValidatorResult> listValidatorResult = errosEspecificos.Keys.OrderBy(ra => ra.Index).ToList();
            int indice = 1;
            int index_validator = 1;
            //painelExcecao.Text = string.Empty;
            foreach (ValidatorResult vr in listValidatorResult)
            {
                vr.Validator.IsValid = false;
                vr.Validator.Text = indice.ToString();
                vr.Validator.ErrorMessage = "<table><tr><td>" + indice.ToString() + " - </td><td>";
                foreach (ResultMessage resultMessage in errosEspecificos[vr])
                {
                    if (!resultMessage.Equals(errosEspecificos[vr].First()))
                    {
                        vr.Validator.ErrorMessage += "<tr><td/><td>";
                    }
                    foreach (string info in resultMessage.Informations)
                    {
                        if (!(info as object).Equals(resultMessage.Informations.First()))
                        {
                            vr.Validator.ErrorMessage += "<tr><td/><td>";
                        }
                        vr.Validator.ErrorMessage += info + "</td></tr>";
                        //LinkButton lkb = new LinkButton();
                        //lkb.ID = "lbk_validation" + index_validator++;
                        //lkb.OnClientClick = "javascript:$get('" + tr.TargetValidationControl.ClientID + "').focus();return false;";
                        //lkb.Text = ;
                        //painelExcecao.Controls.Add(lkb);
                        //Literal litBreakLine = new Literal();
                        //litBreakLine.Text = "<br />";
                        //painelExcecao.Controls.Add(litBreakLine);
                        //textControl.Text += 
                    }
                }
                indice++;
                vr.Validator.ErrorMessage += "</table>";
            }

            //foreach (ResultMessage resultMessage in errosGenericos)
            //{
            //    foreach (string info in resultMessage.Informations)
            //    {
            //        Literal lit = new Literal();
            //        lit.ID = "lit_validation_generic" + index_validator++;
            //        lit.Text = indice.ToString() + " - " + info;
            //        painelExcecao.Controls.Add(lit);
            //        Literal litBreakLine = new Literal();
            //        litBreakLine.Text = "<br />";
            //        painelExcecao.Controls.Add(litBreakLine);
            //        indice++;
            //    }
            //}
        }

        private static void ClearAllMessageValidationControls(ListOfValidatorResult listOfValidatorResult)
        {
            foreach (ValidatorResult validatorResult in listOfValidatorResult)
            {
                if (validatorResult.Validator != null)
                {
                    validatorResult.Validator.IsValid = true;
                    validatorResult.Validator.Text = string.Empty;
                    validatorResult.Validator.ErrorMessage = string.Empty;
                }
            }
        }
    }
}
